//
// Created by A on 2024/6/21.
//
#include "spirit.h"
#include "SDL.h"
#include "config.h"
extern "C"{
#include <math.h>
}

void Mspirit::Mspirit_run() {
    //碰撞检测


    //根据状态绘制动画
    SDL_Rect  local,flocal;
  //  spirit_clock =SDL_GetTicks64();
    if(attribute.key==leader){
        Dspeed_Y = speed_Y;
        Dspeed_X = speed_X;

//        My_Crasg.x+=Dspeed_X; //地图速度
//        My_Crasg.y+=Dspeed_Y;

        //获取地图大小
        LNode * map_node = map_get_linkhandle();
        Map_head * Pmap_data;
        if(map_node!= nullptr){
            Pmap_data = (Map_head *)map_node->Ldata.pp;
        } else{
            exit(-1);
        }
        if(My_Crasg.x<=0&&My_Crasg.y>0&&My_Crasg.y<Pmap_data->h-HEIGHT){//到达左边界 并且没有达到上边界没有达到下边界
            My_Crasg.x=0;
            Rect.grc_y=HEIGHT/2;
            if(Rect.grc_x<=WIDTH/2){
                Rect.grc_x+=Dspeed_X;
            }
            else
                My_Crasg.x+=Dspeed_X; //地图速度
            My_Crasg.y+=Dspeed_Y;
          //  Rect.grc_y = HEIGHT/2;
        }else if(My_Crasg.y<=0&&My_Crasg.x>0&&My_Crasg.x<Pmap_data->w-WIDTH){//到达上边界 且没有达到左边界没有达到右边界
            My_Crasg.y=0;
            Rect.grc_x = WIDTH/2; //人物位置
            if(Rect.grc_y<=HEIGHT/2){
                Rect.grc_y +=Dspeed_Y;
            }else
                My_Crasg.y+=Dspeed_Y;
            My_Crasg.x+=Dspeed_X; //地图速度
            // Rect.grc_x = WIDTH/2;
        }else if(My_Crasg.x>=Pmap_data->w-WIDTH&&My_Crasg.y>0&&My_Crasg.y<Pmap_data->h-HEIGHT){//到达右边界 且没有到达上边界没有到达下边界
            My_Crasg.x=Pmap_data->w-WIDTH;
            Rect.grc_y=HEIGHT/2;
            if(Rect.grc_x>=WIDTH/2){
                Rect.grc_x+=Dspeed_X;
            }else
                My_Crasg.x+=Dspeed_X;
            My_Crasg.y+=Dspeed_Y;
        }else if(My_Crasg.y>=Pmap_data->h-HEIGHT&&My_Crasg.x>0&&My_Crasg.x<Pmap_data->w-WIDTH){//到达下边界 且没有达到左边界没有达到右边界
            My_Crasg.y=Pmap_data->h-HEIGHT;
            Rect.grc_x = WIDTH/2; //人物位置
            if(Rect.grc_y>=HEIGHT/2)
                Rect.grc_y +=Dspeed_Y;
            else
                My_Crasg.y+=Dspeed_Y;
            My_Crasg.x+=Dspeed_X; //地图速度
        }else if((My_Crasg.y<=0)&&(My_Crasg.x<=0)){//到达上边界和左边界
//            My_Crasg.x=0;
//            My_Crasg.y=0;
            if(Rect.grc_x<=WIDTH/2){
                Rect.grc_x+=Dspeed_X;
            }else
                My_Crasg.x+=Dspeed_X; //地图速度

            if(Rect.grc_y<=HEIGHT/2){
                Rect.grc_y +=Dspeed_Y;
            }else
                My_Crasg.y+=Dspeed_Y;

        }else if((My_Crasg.y<=0)&&(My_Crasg.x>=Pmap_data->w-WIDTH)){//到达上边界和右边界
            if(Rect.grc_y<=HEIGHT/2){
                Rect.grc_y +=Dspeed_Y;
            }else
                My_Crasg.y+=Dspeed_Y;
            if(Rect.grc_x>=WIDTH/2){
                Rect.grc_x+=Dspeed_X;
            }else
                My_Crasg.x+=Dspeed_X;

        }else if((My_Crasg.y>=Pmap_data->h-HEIGHT)&&(My_Crasg.x<=0)){//到达下边界和左边界
            if(Rect.grc_y>=HEIGHT/2)
                Rect.grc_y +=Dspeed_Y;
            else
                My_Crasg.y+=Dspeed_Y;
            if(Rect.grc_x<=WIDTH/2){
                Rect.grc_x+=Dspeed_X;
            }
            else
                My_Crasg.x+=Dspeed_X;
        }else if((My_Crasg.y>=Pmap_data->h-HEIGHT)&&(My_Crasg.x>=Pmap_data->w-WIDTH)){//到达下边界和右边界
            if(Rect.grc_y>=HEIGHT/2)
                Rect.grc_y +=Dspeed_Y;
            else
                My_Crasg.y+=Dspeed_Y;
            if(Rect.grc_x>=WIDTH/2){
                Rect.grc_x+=Dspeed_X;
            }else
                My_Crasg.x+=Dspeed_X;
        }
        else if((My_Crasg.x>0)&&(My_Crasg.y>0)&&(My_Crasg.x<Pmap_data->w-WIDTH)&&(My_Crasg.y<Pmap_data->h-HEIGHT))//不在边界
         {
            Rect.grc_x = WIDTH/2; //人物位置
            Rect.grc_y = HEIGHT/2;
             My_Crasg.x+=Dspeed_X; //地图速度
             My_Crasg.y+=Dspeed_Y;
        }

        //人物限制在地图内
        if(Rect.grc_x<0){
            Rect.grc_x=0;
        } else if(Rect.grc_y<0){
            Rect.grc_y=0;
        }else if(Rect.grc_x+Rect.w>WIDTH){
            Rect.grc_x =WIDTH-Rect.w;
        }else if(Rect.grc_y+Rect.h>HEIGHT){
            Rect.grc_y =HEIGHT-Rect.h;
        }

        if(Dspeed_Y<0){
            mation.idle.type=0;//向上
        }else if(Dspeed_Y>0)
            mation.idle.type=4;//向下
        else if(Dspeed_X<0)
            mation.idle.type=6;//向左
        else if(Dspeed_X>0)
            mation.idle.type=2;//向右


        printf("%d %d %d %d\n",My_Crasg.x,My_Crasg.y,Rect.grc_x,Rect.grc_y);





    } else if(attribute.key==map){
        Rect.grc_x = Rect.x- My_Crasg.x;
        Rect.grc_y = Rect.y- My_Crasg.y;

    }
    if(Status==idle){
       // printf("idle\n");
        if(last_status!=Status){//发送状态切换 重新第一帧开始
            frame=0;
        }
        local.x=Rect.grc_x;
        local.y=Rect.grc_y;
        local.w=Rect.w;
        local.h=Rect.h;
        flocal.x=mation.idle.framedata[mation.idle.type][frame].original_Rect.x;
        flocal.y=mation.idle.framedata[mation.idle.type][frame].original_Rect.y;
        flocal.w=mation.idle.framedata[mation.idle.type][frame].original_Rect.w;
        flocal.h=mation.idle.framedata[mation.idle.type][frame].original_Rect.h;

        if(spirit_clock<=SDL_GetTicks64()){//时间到达
            if(abs(Dspeed_Y)>=(dif_shift_speed+dif_speed)||abs(Dspeed_X)>=(dif_shift_speed+dif_speed))//是否是加速状态 加速状态动画二倍速播放
                 spirit_clock = spirit_clock+mation.idle.framedata[mation.idle.type][frame].delat_time/2;
            else
                spirit_clock = spirit_clock+mation.idle.framedata[mation.idle.type][frame].delat_time;
          //  printf("time come!\n");
            SDL_RenderCopyEx(ren, (SDL_Texture *)mation.idle.framedata[mation.idle.type][frame].resoures, &flocal, &local,0,NULL,SDL_FLIP_NONE);
            frame++;
            if(frame>=mation.idle.frame_num[mation.idle.type]) frame=0;
        } else{
            SDL_RenderCopyEx(ren, (SDL_Texture *)mation.idle.framedata[mation.idle.type][frame].resoures, &flocal, &local,0,NULL,SDL_FLIP_NONE);
        }

    }else if(Status==run){
        printf("run\n");

    }else if(Status==inter){

        printf("inter\n");
    }else if(Status==appear){

        printf("appear\n");
    }else if(Status==death){

        printf("death\n");
    }else if(Status==attack){

        printf("attack\n");
    }



    last_status=Status;
}


/**
 *  Mspirit * ptr = new Mspirit; //为精灵开辟内存 完全相同的精灵只需要开辟一次，之后创建链表的时候共用 ----实践得出不能这样 不然每一个的位置也一样了
 *
 *  Mspirit_Init(ptr);  //为精灵初始化
 *
 *  Mspirit_joinLink(ptr); //将精灵加入渲染链表
 *
 *  Mspirit_deleteLink(ptr); //将精灵从渲染列表中删除
 *
 *  Mspirit_Linkrun(); //精灵链表依次调佣run
 *
 * */



//获取精灵链表头
LNode* Get_Mspirit_LinkHandle(){
    return Spirit_Link;
}






/**
 * @brief 将精灵加入渲染链表
 * @param ptr ->Mspirit * ptr = new Mspirit
 * @param pnode 要添加进的链表
 * @return 加入成功之后的key值 之后删除可以通过这个key值删除
 * */
int Mspirit_joinLink(Mspirit *ptr,LNode* pnode){
    if(ptr==NULL)
        return -1;
    int ret = 0;
//    LNode* pnode=Get_Mspirit_LinkHandle();
   int key=  ListLength(pnode);
    data nodedata={
            .key = key,
            .pp = ptr
    };
    ret = CreateList_R(pnode,nodedata);
    if(ret==0) return -1;
    return key;
}

/**
 * @brief 将精灵从渲染列表中删除
 * @param spirit_key Mspirit_joinLink返回的key
 * @param pnode 要添加进的链表
 * @return 0成功 -1失败
 * */

int Mspirit_deleteLink(uint32_t spirit_key,LNode* pnode){
    //采用精灵唯一识别码删除
    int ret = 0;
//    LNode* pnode=Get_Mspirit_LinkHandle();
    ret = LocateElem_L_N(pnode,spirit_key);
    if(ret==0) return -1;
    return 0;

}
/**
 * @brief 一次渲染精灵链表
 * @param pnode 要渲染的链表
 * @return 链表中的精灵个数
 * */
int Mspirit_Linkrun(LNode* pnode){
    LNode* p;
    int i = 0;
    p = pnode->next;
    Mspirit * Pspirit=NULL;
    while (p) {
        Pspirit =( Mspirit *) p->Ldata.pp;
        Pspirit->Mspirit_run();
        p = p->next;
        i++;
    }
    return i;
}

